package de.e2it3t.schulverwaltung.ui;

import com.jgoodies.forms.layout.CellConstraints;
import com.jgoodies.forms.layout.FormLayout;
import com.michaelbaranov.microba.calendar.DatePicker;
import de.e2it3t.schulverwaltung.App;
import de.e2it3t.schulverwaltung.data.CommonTableModel;
import de.e2it3t.schulverwaltung.data.SchuelerSucheTable;
import de.e2it3t.schulverwaltung.data.TimeHelper;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.sql.Time;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.Date;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.JTextField;
import javax.swing.table.DefaultTableCellRenderer;

/**
 * Ansicht der Suche von Schülern.
 * 
 * @author Markus Kunz
 */
public class SchuelerSucheView extends JPanel implements AppView {

    private JTextField vornameField;
    private JTextField nachnameField;
    private DatePicker vonField;
    private DatePicker bisField;
    private JButton suchenButton;
    private JTable sucheTable;
    
    public SchuelerSucheView() {
        setupUiComponents();
        setupTable();
        
        setLayout(new FormLayout(
                "pref, 5px, fill:pref:grow, 5px, pref, 5px, fill:pref:grow, 5px, "
                + "pref, 5px, pref, 5px, pref, 5px, pref, 5px, pref, 5px, pref",
                "pref, 5px, fill:pref:grow"));
        CellConstraints cc = new CellConstraints();
        
        SimpleDateFormat sdf = new SimpleDateFormat("dd.MM.yyyy");
        Calendar cal = Calendar.getInstance();
        cal.add(Calendar.MONTH, 1);
        
        add(new JLabel("Vorname"), cc.xy(1, 1));
        add(vornameField = new JTextField(), cc.xy(3, 1));
        add(new JLabel("Nachname"), cc.xy(5, 1));
        add(nachnameField = new JTextField(), cc.xy(7, 1));
        add(new JLabel("Von"), cc.xy(9, 1));
        add(vonField = new DatePicker(new Date(), sdf), cc.xy(11, 1));
        add(new JLabel("Bis"), cc.xy(13, 1));
        add(bisField = new DatePicker(cal.getTime(), sdf), cc.xy(15, 1));
        add(suchenButton, cc.xy(17, 1));
        add(App.createInfoButton("<html>Die Schülersuche ermöglicht das Suchen nach Schülern "
                + "und liefert die Unterrichtete Lehreinheit und das genaue Datum inklusive Uhrzeit.<br><br>"
                + "Ein Schüler kann nur gefunden werden, wenn für seine Klasse ein Stundenplan und diesem "
                + "wiederum mindestens ein Lehrblock zugewiesen ist (da diese zwei Komponenten Ort und Zeit "
                + "seines Aufenthaltes festlegen). Bei der Suche sollte auch unbedingt darauf geachtet werden, "
                + "das geeignete Datumsgrenzen festgelegt werden.", 400, 180), cc.xy(19, 1));
        add(new JScrollPane(sucheTable), cc.xywh(1, 3, 19, 1));
    }
    
    private void setupUiComponents() {
        suchenButton = new JButton("Suchen");
        suchenButton.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List<SchuelerSucheTable> schueler = App.getDatabase()
                        .sucheSchüler(vornameField.getText(), nachnameField.getText());
                List<SchuelerSucheTable> foundSchueler
                        = new ArrayList<SchuelerSucheTable>();
                
                for (SchuelerSucheTable s : schueler) {
                    s.buildDatum();
                        
                    if (s.getDatum().compareTo(vonField.getDate()) >= 0
                            && s.getDatum().compareTo(bisField.getDate()) <= 0) {
                        foundSchueler.add(s);
                    }
                }
                
                sucheTable.setModel(new CommonTableModel(
                        foundSchueler,
                        new String[] {"schueler", "lehrer", "klasse", "fach", "raum", "datumString", "uhrzeitBeginn", "uhrzeitEnde"},
                        new String[] {"Schüler", "Lehrer", "Klasse", "Fach", "Raum", "Datum", "Von", "Bis"}));
                sucheTable.getColumnModel().getColumn(6).setCellRenderer(
                        new TimeCellRenderer());
                sucheTable.getColumnModel().getColumn(7).setCellRenderer(
                        new TimeCellRenderer());
            }
        });
    }
    
    private void setupTable() {
        sucheTable = new JTable();
        // Liste soll den kompletten, zur Verfügung stehenden Platz nutzen
        sucheTable.setFillsViewportHeight(true);
        // Hack: wir brauchen eine gewünschte Größe, damit die Liste
        // gescrollt werden kann, wenn sie zu viele Einträge hat
        sucheTable.setPreferredScrollableViewportSize(new Dimension(50, 50));
        // wir wollen die Liste durch Klick auf die Header sortieren können
        sucheTable.setAutoCreateRowSorter(true);
    }
    
    
    @Override
    public void refreshView() {
        
    }

    @Override
    public JComponent getView() {
        return this;
    }

    @Override
    public String getViewName() {
        return "Schülersuche";
    }
    
    
    private static class TimeCellRenderer extends DefaultTableCellRenderer {
        
        @Override
        public void setValue(Object value) {
            if (value == null || !(value instanceof Time)) {
                super.setValue(value);
                return;
            }
            
            setText(TimeHelper.getTimeString((Time)value));
        }
    }
}
